﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Net;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

namespace Vkontakte.Api.Forms
{
	public partial class Authenticator
		: UserControl, IVkApiAutorizationMethod
	{
		private Session _session;

		public Authenticator()
		{
			InitializeComponent();
			webBrowser.ScrollBarsEnabled = false;
			webBrowser.Navigated += new WebBrowserNavigatedEventHandler(Authenticator_Navigated);
		}

		void Authenticator_Navigated(object sender, WebBrowserNavigatedEventArgs e)
		{
			string url = e.Url.ToString();
			Debug.WriteLine("Url={0}", url);
			if (url.StartsWith("http://vkontakte.ru/login.php?app"))
			{
				// Идет навигация
				return;
			}
			if (url.StartsWith("http://vkontakte.ru/api/login_success"))
			{
				IsAuthorized = true;
				_session = Session.GetFromUrl(url);
				
				CookieContainer container = new CookieContainer();

				 foreach (string cookie in webBrowser.Document.Cookie.Split(';'))
				 {
				 	string name = cookie.Split('=')[0];
				 	string value = cookie.Substring(name.Length + 1);
				 	string path = "/";
				 	string domain = ".vkontakte.ru";
				 	container.Add(new Cookie(name.Trim(), value.Trim(), path, domain));
				 }
				_session.Cookies = container;


				_session.Cookie = webBrowser.Document.Cookie;
				if (Authenticated != null)
				{
					Authenticated();
				}
				return;
			}
			if (url.StartsWith("http://login.vk.com/?vk="))
			{
				// Пользователь должен ввести пароль
				// Но это мы не обрабатываем 
				return;
			}
			if (url.StartsWith("http://vkontakte.ru/login.php?op=slogin&nonenone=1"))
			{
				if (NeedLoginData != null)
				{
					NeedLoginData();
				}
				return;
			}
			if (url.StartsWith("http://vkontakte.ru/login.php?op=slogin"))
			{
				return;
			}
			if (url.StartsWith("http://vkontakte.ru/login"))
			{
				if (NeedLoginData != null)
				{
					NeedLoginData();
				}
				return;
			}
			
			if (url.StartsWith("http://vkontakte.ru/api/login_failure"))
			{
				if (LoginCanceled != null)
				{
					LoginCanceled();
				}
			}
		}

		public int AppID
		{
			get;
			set;
		}

		public ApplicationAccess ApplicationAccess
		{
			get;
			set;
		}

		public bool IsAuthorized
		{
			get;
			private set;
		}

		public Session GetAuthorizationToken()
		{
			return _session;
		}

		public void Authenticate()
		{
			string url = Utils.GetLoginUri(AppID, ApplicationAccess);
			if (webBrowser.InvokeRequired)
			{
				webBrowser.Invoke(new Action<string>(webBrowser.Navigate), url);
			}
			else
			{
				webBrowser.Navigate(url);
			}
		}

		public event Action NeedLoginData;
		public event Action Authenticated;
		public event Action LoginCanceled;
	}
}
